home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-07-28 | 24.0 KB | 832 lines | [TEXT/MPS ] |
- /*
- File: ADASTupleDatabase.cp
-
- Copyright: © 1991-1994 by Apple Computer, Inc.
- All rights reserved.
-
- Part of the AOCE Sample SMSAM Package. Consult the license
- which came with this software for your specific legal rights.
-
- */
-
-
- #if 0
- #ifndef __BLJSTANDARDINCLUDES__
- #include "BLJStandardIncludes.h"
- #endif
-
- #ifndef __ADASTUPLEDATABASE__
- #include "ADASTupleDatabase.h"
- #endif
-
- #ifndef __OCEERRORS__
- #include "OCEErrors.h"
- #endif
-
- #ifndef __UTILITIES__
- #include "Utilities.h"
- #endif
-
- #ifndef __DEBUGGINGGEAR__
- #include "DebuggingGear.h"
- #endif
-
- #ifndef __AYSTHREADGLUE__
- #include "AYSThreadGlue.h"
- #endif
-
- #ifndef __BLJOCEUTILITIES__
- #include "BLJOCEUtilities.h"
- #endif
-
- inline short shortmin(short a, short b) { return (a < b) ? a : b; };
-
- // This macro 'references' a variable, so that a '# warning: variable not used' warning is not
- // generated during a compile. This macro should not cause any code to be generated.
- #ifndef __UNUSED__
- #define unused(x) ((void) &x)
- #define __UNUSED__
- #endif
-
-
- #define majorDebug 0
- #define debugCallback 0
-
-
- #pragma segment TADASTupleDatabase
-
- Boolean SetupAttributeTypeFromKey (AttributeType* attrType, void* key, long keySize) {
- attrType->charSet = smRoman;
- attrType->dataLength = shortmin((short) keySize, kAttributeTypeMaxBytes);
- BlockMove((Ptr) key, (Ptr) &(attrType->body), attrType->dataLength);
-
- return true;
- };
-
- Boolean SetupAttributeValueFromData(AttributeValue& attrValue, void* data, long dataSize) {
- attrValue.tag = typeBinary;
- attrValue.dataLength = shortmin((short) dataSize, 32767);
- attrValue.bytes = (Ptr) data;
-
- return true;
- };
-
- RStringPtr NewCopyRStringPtr (RStringPtr r) {
- RStringPtr result = nil;
- if (r) {
- result = (RStringPtr) FAILNewPtr( r->dataLength + 4);
- result->dataLength = r->dataLength;
- result->charSet = r->charSet;
- BlockMove ((Ptr) r->body, (Ptr) result->body, r->dataLength);
- };
- return result;
- };
-
-
- TADASTupleDatabase::TADASTupleDatabase()
- {
- fAuthIdentity = 0;
- fRecordIDPtr = nil;
- fDirRefNum = 0;
- };
-
- TADASTupleDatabase::~TADASTupleDatabase () {
- if (fRecordIDPtr) {
- DeallocatePtr((Ptr) fRecordIDPtr->rli);
- DeallocatePtr((Ptr) fRecordIDPtr);
- };
- };
-
- typedef struct InfoPassedToCallbackRec {
- short currentAttrIndex; // the index of the current attribute, from 1 .. N
- short attrIndexDesired;
-
- short currentAttrValueIndex; // the index of the current attribute value, from 1..M
- short attrValueIndexDesired;
-
- AttributeTag tag;
- CreationID cid;
- void* data;
- long dataSize;
- };
-
- pascal Boolean OurForEachLocalRecordID(long clientData, const RecordID* recordID) {
- unused(recordID);
- InfoPassedToCallbackRec* infoPassedToCallback = (InfoPassedToCallbackRec*) clientData;
-
- #if debugCallback
- if (keithFlag.Flag(9)) {
- keith << "OurForEachRecordID: "; keith.write((char*) recordID->name->body, recordID->name->dataLength); keith << endl << flush;
- };
- #endif
-
- infoPassedToCallback->currentAttrIndex = 0;
- infoPassedToCallback->currentAttrValueIndex = 0;
-
- return false;
- };
-
-
- pascal Boolean OurForEachAttrType(long clientData, const AttributeType* attrType, AccessMask attrAccessMask) {
- unused(attrType); unused(attrAccessMask);
- InfoPassedToCallbackRec* infoPassedToCallback = (InfoPassedToCallbackRec*) clientData;
-
- #if debugCallback
- if (keithFlag.Flag(9)) {
- keith << "OurForEachAttrType: attrType="; keith.write((char*) attrType->body, attrType->dataLength); keith << endl << flush;
- };
- #endif
-
- infoPassedToCallback->currentAttrIndex += 1;
- infoPassedToCallback->currentAttrValueIndex = 0;
-
- return false;
- };
-
- pascal Boolean OurForEachAttrValue(long clientData, const Attribute* attr) {
- InfoPassedToCallbackRec* infoPassedToCallback = (InfoPassedToCallbackRec*) clientData;
-
- if (attr) {
- ++infoPassedToCallback->currentAttrValueIndex;
-
- #if debugCallback
- if (keithFlag.Flag(9)) {
- keith << "OurForEachAttrValue: attrTag=" << attr->value.tag << " size=" << attr->value.u.binary.dataLength <<
- " index=" << infoPassedToCallback->currentAttrValueIndex <<
- " desired=" << infoPassedToCallback->attrValueIndexDesired <<
- " (" << infoPassedToCallback->currentAttrIndex << "," << infoPassedToCallback->attrIndexDesired << ")" << endl << flush;
- };
- #endif
-
- if ((infoPassedToCallback->currentAttrIndex == infoPassedToCallback->attrIndexDesired) &&
- (infoPassedToCallback->currentAttrValueIndex == infoPassedToCallback->attrValueIndexDesired)) {
-
- #if debug
- if (keithFlag.Flag(9))
- keith << "OurForEachAttrValue: Matched!, attrType=" << * (RStringPtr) &attr->attributeType << " dataSize=" << attr->value.dataLength << endl;
- #endif
-
- infoPassedToCallback->tag = attr->value.tag;
- infoPassedToCallback->cid = attr->cid;
- if (attr->value.tag == typeBinary) {
- if (infoPassedToCallback->data) {
- infoPassedToCallback->dataSize = shortmin((short) infoPassedToCallback->dataSize, (short) attr->value.dataLength);
- BlockMove ((Ptr) attr->value.bytes, (Ptr) infoPassedToCallback->data, infoPassedToCallback->dataSize);
- } else {
- infoPassedToCallback->dataSize = attr->value.dataLength;
- };
- };
- return true;
- };
- };
-
- return false;
- };
-
-
-
- // This function will get the index-th attribute of the given type from our record. We return the cid, tag, and dataSize bytes of the attribute data.
- Boolean TADASTupleDatabase::GetAttributeFromADASAttributeTypeAndIndex(AttributeType& attrType, long index, CreationID& cid, AttributeTag& tag, void* data, long& dataSize) {
-
- DirLookupGetPB lookupPB;
-
- RecordIDPtr recordArray[1];
- recordArray[0] = fRecordIDPtr;
-
- AttributeTypePtr attributeArray[1];
- attributeArray[0] = &attrType;
-
- Ptr buffer = nil;
-
- if ((data) && (dataSize > 0)) {
- buffer = FAILNewPtrClear(dataSize + 512);
- } else {
- buffer = FAILNewPtrClear(128);
- };
-
- if (buffer == nil)
- return false;
-
- memset(&lookupPB, 0, sizeof(lookupPB));
- lookupPB.ioCompletion = nil;
- lookupPB.serverHint = fServerHint;
- lookupPB.dsRefNum = fDirRefNum;
- lookupPB.identity = fAuthIdentity;
- lookupPB.clientData = nil;
- lookupPB.aRecordList = recordArray;
- lookupPB.recordIDCount = 1;
- lookupPB.attrTypeCount = 1;
- lookupPB.attrTypeList = attributeArray;
- lookupPB.getBuffer = buffer;
- lookupPB.getBufferSize = GetPtrSize(buffer);
- lookupPB.startingRecordIndex = 1;
- lookupPB.startingAttrTypeIndex = 1;
-
- lookupPB.startingAttribute.attributeType = attrType;
- OCESetCreationIDtoNull(&lookupPB.startingAttribute.cid);
-
- InfoPassedToCallbackRec callbackInfo;
- memset(&callbackInfo, 0, sizeof(callbackInfo));
- callbackInfo.data = data;
- callbackInfo.dataSize = dataSize;
- callbackInfo.attrIndexDesired = 1;
- callbackInfo.attrValueIndexDesired = (short) index;
-
- OSErr err = noErr;
-
- do {
- err = DirLookupGetSleep((DirParamBlockPtr) &lookupPB);
-
- #if debug
- if ((err) && (err != kOCEMoreData)) {
- keith << "GetAttributeFrom…/DSLookupGet: err#=" << err << endl << flush;
- };
- #endif
-
- if ((err == noErr) || (err == kOCEMoreData) || (err == kOCEMoreAttrValue)) {
- DirLookupParsePB parsePB;
-
- parsePB.aRecordList = lookupPB.aRecordList;
- parsePB.attrTypeList = lookupPB.attrTypeList;
- parsePB.recordIDCount = lookupPB.recordIDCount;
- parsePB.attrTypeCount = lookupPB.attrTypeCount;
- parsePB.getBuffer = lookupPB.getBuffer;
- parsePB.getBufferSize = lookupPB.getBufferSize;
-
- parsePB.eachRecordID = OurForEachLocalRecordID;
- parsePB.eachAttrType = OurForEachAttrType;
- parsePB.eachAttrValue = OurForEachAttrValue;
- parsePB.clientData = (long) &callbackInfo;
-
- err = DirLookupParseSleep((DirParamBlockPtr) &parsePB);
-
- #if debug
- if (err)
- keith << "GetAttributeFrom…/DirLookupParse: err#=" << err << endl << flush;
- #endif
-
- if ((err == noErr) && (callbackInfo.currentAttrValueIndex == index)) {
- dataSize = callbackInfo.dataSize;
- OCECopyCreationID(&callbackInfo.cid, &cid);
- tag = callbackInfo.tag;
- DeallocatePtr(buffer);
-
- #if debug
- if (keithFlag.Flag(9))
- keith << " Matched! dataSize=" << dataSize << " cid=" << cid.source << "," << cid.seq << " tag=" << tag << endl << flush;
- #endif
-
- return true;
- } else {
- if (err == kOCEMoreAttrValue) {
- dataSize = parsePB.attrSize;
- return false;
- };
- };
- };
- } while ((err == kOCEMoreData) || (err == kOCEMoreAttrValue));
-
- DeallocatePtr(buffer);
- return false;
- };
-
- Boolean TADASTupleDatabase::GetTupleSize(void* key, long keySize, long &dataSize) {
- AttributeType attrType;
- CreationID attrCID;
- AttributeTag attrTag;
-
- SetupAttributeTypeFromKey(&attrType, key, keySize);
- dataSize = 0;
- if (GetAttributeFromADASAttributeTypeAndIndex(attrType, 1, attrCID, attrTag, nil, dataSize)) {
- #if debug
- if (keithFlag.Flag(9)) {
- keith << "TADAS…:GetTupleSize('"; keith.write((char*) key, (int) keySize); keith << "') returning TRUE, size = " << dataSize << endl << flush;
- };
- #endif
- return true;
- }
-
- #if debug
- if (keithFlag.Flag(9)) {
- keith << "TADAS…:GetTupleSize('"; keith.write((char*) key, (int) keySize); keith << "') returning FALSE." << endl << flush;
- };
- #endif
- dataSize = 0;
- return false;
- };
-
-
- Boolean TADASTupleDatabase::GetTuple(void* key, long keySize) {
- long actualSize = 0, dataSize = 0;
-
- return GetTuple(key, keySize, actualSize, nil, dataSize);
- };
-
- Boolean TADASTupleDatabase::GetTuple(void* key, long keySize, long& actualDataSize, void *data, long dataSize) {
- AttributeType attrType;
- CreationID attrCID;
- AttributeTag attrTag;
-
- SetupAttributeTypeFromKey(&attrType, key, keySize);
- if (GetAttributeFromADASAttributeTypeAndIndex(attrType, 1, attrCID, attrTag, data, dataSize)) {
- #if debug
- if (keithFlag.Flag(9)) {
- keith << "TADAS…:GetTuple('"; keith.write((char*) key, (int) keySize); keith << " TRUE, data (" << dataSize << ") '";
- keith.write((char*) data, (int) shortmin(1024, dataSize)); keith << "'" << endl << flush;
- };
- #endif
- actualDataSize = dataSize;
- return true;
- };
-
- #if debug
- if (keithFlag.Flag(9)) {
- keith << "TADAS…:GetTuple('"; keith.write((char*) key, (int) keySize); keith << " FALSE." << endl << flush;
- };
- #endif
- actualDataSize = 0;
- return false;
- };
-
- Boolean TADASTupleDatabase::SetTuple(void *key, long keySize, void *data, long dataSize) {
- Attribute attr;
- AttributeTag attrTag;
- OSErr err = noErr;
-
- SetupAttributeTypeFromKey(&attr.attributeType, key, keySize);
- SetupAttributeValueFromData (attr.value, data, dataSize);
-
- long temp = 0; // this is ahack to fix a non-const ref to 0 bug-pfl
-
- if (GetAttributeFromADASAttributeTypeAndIndex( attr.attributeType, 1, attr.cid, attrTag, nil, temp)) {
- DirDeleteAttributeValuePB changeAttrPB;
-
- #if debug
- if (keithFlag.Flag(9)) {
- keith << "TADAS…:SetTuple('"; keith.write((char*) key, (int) keySize); keith << " <R> data (" << dataSize << ") '";
- keith.write((char*) data, (int) shortmin(1024, dataSize)); keith << "'" << endl << flush;
- };
- #endif
-
- attr.value.tag = typeBinary;
- attr.value.dataLength = shortmin((short) dataSize, 32767);
- attr.value.bytes = (char*) data;
-
- memset(&changeAttrPB, 0, sizeof(changeAttrPB));
- changeAttrPB.serverHint = fServerHint;
- changeAttrPB.dsRefNum = fDirRefNum;
- changeAttrPB.identity = fAuthIdentity;
- changeAttrPB.clientData = nil;
- changeAttrPB.aRecord = fRecordIDPtr;
- changeAttrPB.attr = &attr;
-
- err = DirChangeAttributeValueSleep((DirParamBlockPtr) &changeAttrPB);
-
- #if debug
- if (err) keith << "SetTuple/DirChangeAttribute: err#=" << err << endl << flush;
- #endif
-
- return (err == noErr);
- } else {
- DirAddAttributeValuePB addAttrPB;
-
- #if debug
- if (keithFlag.Flag(9)) {
- keith << "TADAS…:SetTuple('"; keith.write((char*) key, (int) keySize); keith << " <A> data (" << dataSize << ") '";
- keith.write((char*) data, (int) shortmin(1024, dataSize)); keith << "'" << endl << flush;
- };
- #endif
-
- OCESetCreationIDtoNull(&attr.cid);
-
- memset(&addAttrPB, 0, sizeof(addAttrPB));
- addAttrPB.ioCompletion = nil;
- addAttrPB.serverHint = fServerHint;
- addAttrPB.dsRefNum = fDirRefNum;
- addAttrPB.identity = fAuthIdentity;
- addAttrPB.clientData = nil;
- addAttrPB.aRecord = fRecordIDPtr;
- addAttrPB.attr = &attr;
-
- err = DirAddAttributeValueSleep((DirParamBlockPtr) &addAttrPB);
-
- #if debug
- if (err) keith << "SetTuple/DirAddAttribute: err#=" << err << endl << flush;
- #endif
- };
-
- return (err == noErr);
- };
-
-
- Boolean TADASTupleDatabase::DeleteTuple(void *key, long keySize) {
- DirDeleteAttributeTypePB deleteAttrPB;
- AttributeType attrType;
-
- #if debug
- if (keithFlag.Flag(9)) {
- keith << "TADAS…:DeleteTuple('"; keith.write((char*) key, (int) keySize); keith << endl << flush;
- };
- #endif
-
- SetupAttributeTypeFromKey(&attrType, key, keySize);
-
- memset(&deleteAttrPB, 0, sizeof(deleteAttrPB));
- deleteAttrPB.ioCompletion = nil;
- deleteAttrPB.serverHint = fServerHint;
- deleteAttrPB.dsRefNum = fDirRefNum;
- deleteAttrPB.identity = fAuthIdentity;
- deleteAttrPB.clientData = nil;
- deleteAttrPB.aRecord = fRecordIDPtr;
- deleteAttrPB.attrType = &attrType;
-
- OSErr err = DirDeleteAttributeTypeSleep((DirParamBlockPtr) &deleteAttrPB);
- if (err) keith << "DeleteTuple/DirDeleteAttributeValue, err#=" << err << endl << flush;
-
- return (err == noErr);
- };
-
- pascal Boolean CountTuplesForEachAttrType (long clientData, const AttributeType* attrType) {
- long* count = (long*) clientData;
-
- if (attrType) {
- (*count)++;
- #if debugCallback
- if (keithFlag.Flag(9)) {
- keith << "CountTuplesForEachAttrType, type=" << (RStringPtr) attrType << endl << flush;
- };
- #endif
- };
- return false;
- };
-
- long TADASTupleDatabase::CountTuples() {
- long result = 0;
-
- DirEnumerateAttributeTypesGetPB enumeratePB;
-
- // We do a count of the number of tuples available by counting the number of attributes.
- memset(&enumeratePB, 0, sizeof(enumeratePB));
- enumeratePB.ioCompletion = nil;
- enumeratePB.serverHint = fServerHint;
- enumeratePB.dsRefNum = fDirRefNum;
- enumeratePB.identity = fAuthIdentity;
- enumeratePB.clientData = (long) &result;
- enumeratePB.aRecord = fRecordIDPtr;
- enumeratePB.getBuffer = FAILNewPtrClear(8192); // this is big for now, because there's no way to
- // continue an enumerateAttributeTypes. When there
- // is, this should allocate a small buffer & loop
- enumeratePB.getBufferSize = GetPtrSize((Ptr) enumeratePB.getBuffer);
-
- OSErr err = noErr;
- do {
- err = DirEnumerateAttributeTypesGetSleep((DirParamBlockPtr) &enumeratePB);
-
- #if debug
- if (err) keith << "CountTuples/DirLookupGet: err#=" << err << endl << flush;
- #endif
-
- if ((err == noErr) || (err == kOCEMoreData) || (err == kOCEMoreAttrValue)) {
- DirEnumerateAttributeTypesParsePB parsePB;
-
- parsePB.aRecord = enumeratePB.aRecord;
- parsePB.eachAttrType = CountTuplesForEachAttrType;
- parsePB.getBuffer = enumeratePB.getBuffer;
- parsePB.getBufferSize = enumeratePB.getBufferSize;
-
- err = DirEnumerateAttributeTypesParseSleep((DirParamBlockPtr) &parsePB);
-
- #if debug
- if (err) keith << "CountTuples/DirEnumerateAttributeTypesParse, err#=" << err << endl << flush;
- #endif
- };
- } while ((err == kOCEMoreData) || (err == kOCEMoreAttrValue));
-
- DeallocatePtr((Ptr) enumeratePB.getBuffer);
-
- return result;
- };
-
- typedef struct GetIndexAttributeCallbackInfoRec {
- long remainingCount;
- Boolean found;
- AttributeTypePtr attrType;
- };
-
- pascal Boolean GetIndexAttributeForEachAttrType (long clientData, const AttributeType* attrType) {
- GetIndexAttributeCallbackInfoRec* info = (GetIndexAttributeCallbackInfoRec*) clientData;
-
- if (attrType) {
- #if debugCallback
- if (keithFlag.Flag(9)) {
- keith << "GetIndexAttributeForEachAttrType, count=" << info->remainingCount << " " << (RStringPtr) attrType << endl << flush;
- };
- #endif
-
- info->remainingCount -= 1;
-
- if (info->remainingCount == 0) {
- info->found = true;
- OCECopyRString ((RStringPtr) attrType, (RStringPtr) info->attrType, kAttributeTypeMaxBytes);
- return true;
- };
- };
- return false;
- };
-
- Boolean TADASTupleDatabase::GetIndexAttribute (long i, AttributeType& attrType) {
- GetIndexAttributeCallbackInfoRec callbackInfo;
-
- // Indexes start with 1
- if (i < 1)
- return false;
-
- callbackInfo.remainingCount = i;
- callbackInfo.found = false;
- callbackInfo.attrType = &attrType;
-
- #if debug
- if (keithFlag.Flag(9)) {
- keith << "GetIndexAttribute: entering, index=" << i << endl << flush;
- };
- #endif
-
- // We do a count of the number of tuples available by counting the number of attributes.
- DirEnumerateAttributeTypesGetPB enumeratePB;
- memset(&enumeratePB, 0, sizeof(enumeratePB));
- enumeratePB.ioCompletion = nil;
- enumeratePB.serverHint = fServerHint;
- enumeratePB.dsRefNum = fDirRefNum;
- enumeratePB.identity = fAuthIdentity;
- enumeratePB.clientData = (long) &callbackInfo;
- enumeratePB.aRecord = fRecordIDPtr;
- enumeratePB.getBuffer = FAILNewPtrClear(8192); // this is big for now, because there's no way to
- // continue an enumerateAttributeTypes. When there
- // is, this should allocate a small buffer & loop
- enumeratePB.getBufferSize = GetPtrSize((Ptr) enumeratePB.getBuffer);
-
- OSErr err = noErr;
- do {
- err = DirEnumerateAttributeTypesGetSleep((DirParamBlockPtr) &enumeratePB);
-
- #if debug
- if (err) keith << "GetIndexAttribute/DirEnumerateAttributeTypesGet: err#=" << err << endl << flush;
- #endif
-
- if ((err == noErr) || (err == kOCEMoreData) || (err == kOCEMoreAttrValue)) {
- DirEnumerateAttributeTypesParsePB parsePB;
-
- parsePB.aRecord = enumeratePB.aRecord;
- parsePB.eachAttrType = GetIndexAttributeForEachAttrType;
- parsePB.getBuffer = enumeratePB.getBuffer;
- parsePB.getBufferSize = enumeratePB.getBufferSize;
-
- err = DirEnumerateAttributeTypesParseSleep((DirParamBlockPtr) &parsePB);
-
- #if debug
- if (err) keith << "GetIndexAttribute/DirEnumerateAttributeTypesParse, err#=" << err << endl << flush;
- #endif
- };
- } while ((err == kOCEMoreData) || (err == kOCEMoreAttrValue));
-
- DeallocatePtr((Ptr) enumeratePB.getBuffer);
-
- return callbackInfo.found;
- };
-
-
- Boolean TADASTupleDatabase::GetIndexTuple(long i, void *key, long &keySize) {
- long dataSize = 0;
-
- return GetIndexTuple(i, key, keySize, nil, dataSize);
- };
-
- Boolean TADASTupleDatabase::GetIndexTuple(long i, void *key, long& keySize, void *data, long &dataSize) {
- AttributeType attrType;
-
- if (GetIndexAttribute (i, attrType)) {
- // Copy the attribute back to the user supplied key
- if ((key) && (keySize > 0)) {
- keySize = longmin(keySize, attrType.dataLength);
- BlockMove((Ptr) attrType.body, (Ptr) key, keySize);
- };
-
- if ((data) && (dataSize > 0)) {
- CreationID attrCID;
- AttributeTag attrTag;
- if (GetAttributeFromADASAttributeTypeAndIndex(attrType, 1, attrCID, attrTag, data, dataSize))
- return true;
- dataSize = 0;
- return false;
- } else {
- // Don't return any data, but do return the correct dataSize.
- CreationID attrCID;
- AttributeTag attrTag;
- dataSize = 0;
- if (GetAttributeFromADASAttributeTypeAndIndex(attrType, 1, attrCID, attrTag, nil, dataSize))
- return true;
- dataSize = 0;
- return false;
- };
- return true;
- };
-
- dataSize = 0;
- return false;
- };
-
- Boolean TADASTupleDatabase::FindIndexOfTuple(void *key, long keySize, long &i) {
- unused(key); unused(keySize); unused(i);
-
-
- return false;
- };
-
- Boolean TADASTupleDatabase::SetIndexTuple(long i, void *data, long dataSize) {
- Attribute attr;
-
- if (GetIndexAttribute (i, attr.attributeType)) {
- AttributeTag attrTag;
-
- #if debug
- if (keithFlag.Flag(9)) {
- keith << "SetIndexTuple: index=" << i << " key="; keith.write((char*)attr.attributeType.body, (int) attr.attributeType.dataLength); keith << " length=" << attr.attributeType.dataLength << endl << flush;
- };
- #endif
-
- SetupAttributeValueFromData (attr.value, data, dataSize);
-
- long temp = 0;
-
- if (GetAttributeFromADASAttributeTypeAndIndex(attr.attributeType, 1, attr.cid, attrTag, nil, temp)) {
- Attribute newAttr;
-
- newAttr.value.tag = typeBinary;
- newAttr.value.dataLength = shortmin((short) dataSize, 32767);
- newAttr.value.bytes = (char*) data;
-
- DirChangeAttributeValuePB pb;
- memset(&pb, 0, sizeof(pb));
- pb.ioCompletion = nil;
- pb.serverHint = fServerHint;
- pb.dsRefNum = fDirRefNum;
- pb.identity = fAuthIdentity;
- pb.clientData = nil;
- pb.aRecord = fRecordIDPtr;
- pb.currentAttr = &attr;
- pb.newAttr = &newAttr;
-
- OSErr err = DirChangeAttributeValueSleep ((DirParamBlockPtr) &pb);
-
- #if debug
- if (err) keith << "SetIndexTuple/DirChangeAttribute: err#=" << err << endl << flush;
- #endif
-
- return (err == noErr);
- };
- };
-
- return false;
- };
-
- pascal Boolean IADASTupleDatabaseForEachLocalRecordID (long clientData, const DirEnumSpec *enumSpecPtr) {
- RecordIDPtr recordIDPtr = (RecordIDPtr) clientData;
-
- if ((recordIDPtr) && (enumSpecPtr) && (enumSpecPtr->enumFlag & kEnumDistinguishedNameMask)) {
- recordIDPtr->local.cid = enumSpecPtr->u.recordIdentifier.cid;
- return true;
- };
-
- return false;
- };
-
- Boolean TADASTupleDatabase::IADASTupleDatabase (AuthIdentity identityToUse, short dsRefNum, RecordIDPtr ourRecord, AddrBlock* serverHint) {
-
- fAuthIdentity = identityToUse;
- fDirRefNum = dsRefNum;
-
- if (ourRecord == nil)
- return false;
-
- fRecordIDPtr = (RecordIDPtr) FAILNewPtrClear(sizeof(*fRecordIDPtr));
- if (fRecordIDPtr == nil)
- return false;
-
- fRecordIDPtr->local.recordName = NewCopyRStringPtr(ourRecord->local.recordName);
- fRecordIDPtr->local.recordType = NewCopyRStringPtr(ourRecord->local.recordType);
-
- OCECopyLocalRecordID(&ourRecord->local, &fRecordIDPtr->local);
-
- fRecordIDPtr->rli = (PackedRLIPtr) FAILNewPtr(ourRecord->rli->dataLength + sizeof(ProtoPackedRLI));
- if (fRecordIDPtr->rli == nil) {
- return false;
- };
- OCECopyPackedRLI (ourRecord->rli, fRecordIDPtr->rli, (unsigned short) GetPtrSize((Ptr) fRecordIDPtr->rli));
-
- if (serverHint) {
- fServerHint = *serverHint;
- } else {
- fServerHint.aNet = 0;
- fServerHint.aNode = fServerHint.aSocket = 0;
- };
-
- // Now, we need to enumerate the ADAS directory in order to get the #)*(#$ CID for the record
- // we use. Why there isn't a single call to do this, I don't know.
-
- Boolean result = false;
- { DirEnumerateGetPB enumeratePB;
-
- memset(&enumeratePB, 0, sizeof(enumeratePB));
- enumeratePB.serverHint = fServerHint;
- enumeratePB.dsRefNum = fDirRefNum;
- enumeratePB.identity = fAuthIdentity;
- enumeratePB.clientData = (long) fRecordIDPtr;
- enumeratePB.aRLI = fRecordIDPtr->rli;
- enumeratePB.startingPoint = nil;
- enumeratePB.sortBy = kSortByName;
- enumeratePB.sortDirection = kSortForwards;
- enumeratePB.nameMatchString = fRecordIDPtr->local.recordName;
- enumeratePB.typesList = & (fRecordIDPtr->local.recordType);
- enumeratePB.typeCount = 1;
- enumeratePB.enumFlags = kEnumDistinguishedNameMask;
- enumeratePB.includeStartingPoint = false;
- enumeratePB.getBuffer = FAILNewPtrClear(128);
- enumeratePB.getBufferSize = GetPtrSize((Ptr) enumeratePB.getBuffer);
- // enumeratePB.requestScriptCode = smRoman;
-
- OSErr err = DirEnumerateGetSleep((DirParamBlockPtr) &enumeratePB);
-
- if (err == noErr) {
- DirEnumerateParsePB parsePB;
-
- parsePB.aRLI = enumeratePB.aRLI;
- parsePB.eachEnumSpec = IADASTupleDatabaseForEachLocalRecordID;
- parsePB.getBuffer = enumeratePB.getBuffer;
- parsePB.getBufferSize = enumeratePB.getBufferSize;
-
- err = DirEnumerateParseSleep((DirParamBlockPtr) &parsePB);
-
- if ((fRecordIDPtr->local.cid.source != 0) || (fRecordIDPtr->local.cid.seq != 0))
- result = true;
- };
-
- DeallocatePtr((Ptr) enumeratePB.getBuffer);
- };
-
- return result;
- };
-
- Boolean TADASTupleDatabase::CreateDatabase() {
-
- if (fRecordIDPtr == nil)
- return false;
-
- DirAddRecordPB addRecordPB;
-
- memset(&addRecordPB, 0, sizeof(addRecordPB));
- addRecordPB.ioCompletion = nil;
- addRecordPB.serverHint = fServerHint;
- addRecordPB.dsRefNum = fDirRefNum;
- addRecordPB.identity = fAuthIdentity;
- addRecordPB.clientData = 0;
- addRecordPB.aRecord = fRecordIDPtr;
- addRecordPB.allowDuplicate = false;
-
- OSErr err = DirAddRecordSleep((DirParamBlockPtr) &addRecordPB);
-
- #if debug
- if (err) keith << "CreateDatabase/DirAddRecord err#=" << err << endl << flush;
- #endif
-
- return (err == noErr);
- };
-
- Boolean TADASTupleDatabase::DeleteDatabase () {
- if (fRecordIDPtr == nil)
- return false;
-
- DirDeleteRecordPB deleteRecordPB;
-
- memset(&deleteRecordPB, 0, sizeof(deleteRecordPB));
- deleteRecordPB.ioCompletion = nil;
- deleteRecordPB.serverHint = fServerHint;
- deleteRecordPB.dsRefNum = fDirRefNum;
- deleteRecordPB.identity = fAuthIdentity;
- deleteRecordPB.clientData = 0;
- deleteRecordPB.aRecord = fRecordIDPtr;
-
- OSErr err = DirDeleteRecordSleep((DirParamBlockPtr) &deleteRecordPB);
-
- #if debug
- if (err) keith << "DeleteDatabase/DirDeleteRecord err#=" << err << endl << flush;
- #endif
-
- return (err == noErr);
- };
-
-
- void TADASTupleDatabase::Flush(void) {
- // Right now, don't do anything. Maybe we never will have to do anything.
-
- };
- #endif